enum 提供我們的程式有更佳的可讀性,也能清楚的表現其中成員。
enum CompassPoint:String { //列舉的自定義型別
    case North      //各列舉定義
    case South
    case West
    case East
}
var directionToHead = CompassPoint.West
又能省略成以下
var directionToHead:  CompassPoint = .West
再使用 Switch 語句來搭配列舉值,利用 Switch 判斷 directionToHead 是哪個方向
switch directionToHead {
case .North:
    print("Lots of planets have a north")
case .South:
    print("Watch out for penguins")
case .East:
    print("Where the sun rises")
case .West:
    print("Where the skies are blue")
}
而 enum 也提供 raw value,在宣告 enum 成員時,就可透過 raw value 來指派特定的值。定義 enum 時需要宣告 raw value 型別,且裡面所有成員也需要是同一個型別。
enum WeekDay: Int {
    case Monday = 1
    case Tuesday = 2
    case Wednesday = 3
    case Thursday = 4
    case Friday = 5
    case Saturday = 6
    case Sunday = 7
}
###Implicitly Assigned Raw Values 隱式指定的原始值
enum Planet2: Int {
    case mercury = 1, venus, earth, mars, jupiter,saturn, uranus, neptune
}
以上的例子,Planet2.mercury 有個明確的 raw value 為 1; 則 Planet2.venus 則有個隱式的 raw value 為 2,以此類推。
###Associated Values 關聯值
關聯值提供動態設定的好處,保留之後指定值的彈性。
enum Barcode { //定義一個叫Barcode的列舉類型
    case upc(Int, Int, Int, Int) 
    case qrCode(String) 
}
var productBarcode = Barcode.upc(8, 85909, 51226,3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
        print("UPC: \(numberSystem), \(manufacturer), \(product), \(check)")
case .qrCode(let productCode):
        print("QR Code: \(productCode)")
}